use regex::Regex;
use crate::clothing::Clothing;
use crate::stock::DiscountCalculationTool;
use crate::stock::MatchingRecommendTool;
use crate::tool::ToolCall;
use crate::tool::Tool;
use crate::tool::ToolResult;
use crate::calculator::CalculatorTool;
use crate::weather::WeatherTool;
use crate::stock::StockQueryTool;
// 模拟AI模型（实际项目中可替换为调用GPT/LLaMA等模型的API）
async fn mock_ai_model(prompt: &str) -> String {
    // 模拟模型判断是否需要调用工具：
    // - 如果输入包含"计算"，返回计算器调用指令
    // - 如果输入包含"天气"，返回天气查询指令
    // - 否则直接返回回答
    if prompt.contains("计算") {
        return r#"需要调用工具：{"name":"calculator","parameters":{"a":10,"b":5,"op":"+"}}"#.to_string();
    } else if prompt.contains("天气") {
        return r#"需要调用工具：{"name":"weather","parameters":{"city":"北京"}}"#.to_string();
    } else if prompt.contains("的库存") {
        return r#"需要调用工具：{"name":"stock_query","parameters":{"query":"T恤"}}"#.to_string();
    } else if prompt.contains("搭配") {
        return r#"需要调用工具：{"name":"matching_recommend","parameters":{"selected_id":"2201", "season": "秋季"}}"#.to_string();
    } else if prompt.contains("价格") || prompt.contains("折扣") {
        return r#"需要调用工具：{"name":"discount_calculation","parameters":{"price":500,"discount":0.2,"currency":"CNY","quantity":1,"member_level":"白银"}}"#.to_string();
    } else {
        return "不需要调用工具，直接回答：您好！有什么可以帮助您的？".to_string();
    }
}

// 从模型输出中提取工具调用指令（使用正则匹配JSON）
pub fn extract_tool_call(ai_response: &str) -> Option<ToolCall> {
    // 匹配带换行/空格的JSON对象，支持嵌套结构
    // 正则逻辑：匹配最外层{}，包含"name"和"parameters"字段，支持任意空格和换行
    let re = Regex::new(r#"\{[\s\S]*?"name"\s*:\s*"([^"]+)"[\s\S]*?"parameters"\s*:\s*\{[\s\S]*?\}[^\}]*\}"#)
        .unwrap();

    if let Some(captures) = re.captures(ai_response) {
        let json_str = captures.get(0)?.as_str();
        // 反序列化为 ToolCall（自动适配 HashMap 类型）
        serde_json::from_str(json_str).ok()
    } else {
        None
    }
}

// 工具调用管理器：根据模型指令调用对应的工具
pub struct ToolManager {
    tools: Vec<Box<dyn Tool>>,
}

impl ToolManager {
    fn new(tools: Vec<Box<dyn Tool>>) -> Self {
        ToolManager { tools }
    }

    // 根据工具名称查找并调用工具
    pub fn call(&self, tool_call: &ToolCall) -> ToolResult {
        for tool in &self.tools {
            if tool.name() == tool_call.name {
                return tool.run(&tool_call.parameters).expect("the tool should always return a result");
            }
        }
        ToolResult {
            success: false,
            content: format!("未找到工具：{}", tool_call.name),
        }
    }
}

// 主逻辑：处理用户输入，协调模型和工具调用
async fn process_user_input(user_input: &str, tool_manager: &ToolManager) -> String {
    // 1. 构建提示词，发送给AI模型
    let prompt = format!("用户输入：{}\n请判断是否需要调用工具。如果需要，返回格式为：{{\"name\":\"工具名\",\"parameters\":{{...}}}}", user_input);
    let ai_response = mock_ai_model(&prompt).await;

    // 2. 解析模型输出，判断是否需要调用工具
    if let Some(tool_call) = extract_tool_call(&ai_response) {
        println!("模型决定调用工具：{:?}", tool_call);

        // 3. 调用工具并获取结果
        let tool_result = tool_manager.call(&tool_call);
        println!("工具返回结果：{}", tool_result.content);

        // 4. 将工具结果再次传给模型，生成最终回答
        let final_prompt = format!("工具调用结果：{}\n请根据结果生成自然语言回答。", tool_result.content);
        mock_ai_model(&final_prompt).await
    } else {
        // 不需要调用工具，直接返回模型回答
        ai_response
    }
}

//#[tokio::main]
pub async fn test_tool() {
        // 1. 准备商品数据（初始化 StockQueryTool 需要的 clothes 参数）
 let clothes_data = vec![
    Clothing {
        id: "2201".to_string(),
        name: "户外多功能三合一冲锋衣外套".to_string(),
        category: "外套".to_string(),
        price: 99.0,
        color: vec!["黑色", "蓝色"].into_iter().map(|s| s.to_string()).collect(), // 修正为颜色值
        stock: 50,
        suitable_season: vec!["春季", "秋季"].into_iter().map(|s| s.to_string()).collect(),
        size: vec!["S", "M", "L", "XL"].into_iter().map(|s| s.to_string()).collect(),
        material: vec!["聚酯纤维", "棉"].into_iter().map(|s| s.to_string()).collect(),
        brand: "户外探索".to_string(),
        description: "防风防水，适合多种户外场景".to_string(),
    },
    Clothing {
        id: "2202".to_string(),
        name: "户外多功能三合一冲锋衣外套".to_string(),
        category: "外套".to_string(),
        price: 159.0,
        color: vec!["红色", "灰色"].into_iter().map(|s| s.to_string()).collect(), // 修正为颜色值
        stock: 30,
        suitable_season: vec!["春季", "秋季", "冬季"].into_iter().map(|s| s.to_string()).collect(),
        size: vec!["M", "L", "XL", "XXL"].into_iter().map(|s| s.to_string()).collect(),
        material: vec!["尼龙", "抓绒"].into_iter().map(|s| s.to_string()).collect(),
        brand: "户外探索".to_string(),
        description: "加绒加厚，适合寒冷天气".to_string(),
    },
    Clothing {
        id: "5521".to_string(),
        name: "情侣户外冲锋衣".to_string(),
        category: "外套".to_string(),
        price: 259.0,
        color: vec!["藏青色", "卡其色"].into_iter().map(|s| s.to_string()).collect(), // 修正为颜色值
        stock: 20,
        suitable_season: vec!["秋季", "冬季"].into_iter().map(|s| s.to_string()).collect(),
        size: vec!["S", "M", "L", "XL"].into_iter().map(|s| s.to_string()).collect(),
        material: vec![" Gore-Tex", "聚酯纤维"].into_iter().map(|s| s.to_string()).collect(),
        brand: "情侣户外".to_string(),
        description: "情侣款设计，防风透气".to_string(),
    },
    Clothing {
        id: "5522".to_string(),
        name: "情侣户外冲锋衣".to_string(),
        category: "外套".to_string(),
        price: 259.0,
        color: vec!["黑色", "军绿色"].into_iter().map(|s| s.to_string()).collect(), // 修正为颜色值
        stock: 20,
        suitable_season: vec!["秋季", "冬季"].into_iter().map(|s| s.to_string()).collect(),
        size: vec!["S", "M", "L", "XL", "XXL"].into_iter().map(|s| s.to_string()).collect(),
        material: vec![" Gore-Tex", "聚酯纤维"].into_iter().map(|s| s.to_string()).collect(),
        brand: "情侣户外".to_string(),
        description: "情侣款设计，防风透气".to_string(),
    },
];
    // 初始化工具管理器，注册工具
    let tool_manager = ToolManager::new(vec![
        Box::new(CalculatorTool),
        Box::new(WeatherTool),
        Box::new(StockQueryTool::new(clothes_data.clone())),
        Box::new(MatchingRecommendTool::new(clothes_data.clone())),
        Box::new(DiscountCalculationTool),
    ]);

    // 测试用户输入
    let user_inputs = [
        "计算10加5等于多少",
        "查询北京的天气",
        "查询T恤的库存",
        "推荐T恤的搭配",
        "T恤的促销价格",
        "你好，介绍一下自己",
    ];

    for input in user_inputs {
        println!("\n用户输入：{}", input);
        let response = process_user_input(input, &tool_manager).await;
        println!("最终回答：{}", response);
    }
}

// 生成提示词的函数
pub fn build_prompt(user_input: &str) -> String {
    // 对 JSON 中的 { 用 {{ 转义，} 用 }} 转义，避免与 Rust 格式化冲突
    format!(
        "用户输入：{user_input}

请判断是否需要调用工具。可用工具及参数要求如下：

1. 工具名：stock_query
   功能：在查询衣服库存/价格/详情时候调用
   参数：
     - query：商品ID或名称（例如：\"T恤\" 或 \"2201\"）
   调用示例：{{\"name\":\"stock_query\",\"parameters\":{{\"query\":\"T恤\"}}}}

2. 工具名：matching_recommend
   功能：在推荐衣服搭配时调用
   参数：
     - selected_id：已选商品ID（例如：\"2201\"）
     - season：季节（例如：\"秋季\"）
   调用示例：{{\"name\":\"matching_recommend\",\"parameters\":{{\"selected_id\":\"2201\",\"season\":\"秋季\"}}}}

3. 工具名：discount_calculation
   功能：在计算折扣后价格，或计算促销价格时候才调用
   参数：
     - price：单价（例如：99.0）
     - quantity：数量（例如：2）
     - member_level：会员等级（例如：\"黄金\"）
   调用示例：{{\"name\":\"discount_calculation\",\"parameters\":{{\"price\":99.0,\"quantity\":2,\"member_level\":\"黄金\"}}}}
选择其中的1个工具调用。
如果需要调用工具，请严格按照上述示例格式返回JSON（仅包含工具调用信息，无其他文本）；如果不需要调用工具，请直接返回自然语言回答。",
        user_input = user_input
    )
}

pub fn get_tool_mgr() -> ToolManager {
        // 1. 准备商品数据（初始化 StockQueryTool 需要的 clothes 参数）
 let clothes_data = vec![
    Clothing {
        id: "2201".to_string(),
        name: "户外多功能三合一冲锋衣外套".to_string(),
        category: "外套".to_string(),
        price: 99.0,
        color: vec!["黑色", "蓝色"].into_iter().map(|s| s.to_string()).collect(), // 修正为颜色值
        stock: 50,
        suitable_season: vec!["春季", "秋季"].into_iter().map(|s| s.to_string()).collect(),
        size: vec!["S", "M", "L", "XL"].into_iter().map(|s| s.to_string()).collect(),
        material: vec!["聚酯纤维", "棉"].into_iter().map(|s| s.to_string()).collect(),
        brand: "户外探索".to_string(),
        description: "防风防水，适合多种户外场景".to_string(),
    },
    Clothing {
        id: "2202".to_string(),
        name: "户外多功能三合一冲锋衣外套".to_string(),
        category: "外套".to_string(),
        price: 159.0,
        color: vec!["红色", "灰色"].into_iter().map(|s| s.to_string()).collect(), // 修正为颜色值
        stock: 30,
        suitable_season: vec!["春季", "秋季", "冬季"].into_iter().map(|s| s.to_string()).collect(),
        size: vec!["M", "L", "XL", "XXL"].into_iter().map(|s| s.to_string()).collect(),
        material: vec!["尼龙", "抓绒"].into_iter().map(|s| s.to_string()).collect(),
        brand: "户外探索".to_string(),
        description: "加绒加厚，适合寒冷天气".to_string(),
    },
    Clothing {
        id: "5521".to_string(),
        name: "情侣户外冲锋衣".to_string(),
        category: "外套".to_string(),
        price: 259.0,
        color: vec!["藏青色", "卡其色"].into_iter().map(|s| s.to_string()).collect(), // 修正为颜色值
        stock: 20,
        suitable_season: vec!["秋季", "冬季"].into_iter().map(|s| s.to_string()).collect(),
        size: vec!["S", "M", "L", "XL"].into_iter().map(|s| s.to_string()).collect(),
        material: vec![" Gore-Tex", "聚酯纤维"].into_iter().map(|s| s.to_string()).collect(),
        brand: "情侣户外".to_string(),
        description: "情侣款设计，防风透气".to_string(),
    },
    Clothing {
        id: "5522".to_string(),
        name: "情侣户外冲锋衣".to_string(),
        category: "外套".to_string(),
        price: 259.0,
        color: vec!["黑色", "军绿色"].into_iter().map(|s| s.to_string()).collect(), // 修正为颜色值
        stock: 20,
        suitable_season: vec!["秋季", "冬季"].into_iter().map(|s| s.to_string()).collect(),
        size: vec!["S", "M", "L", "XL", "XXL"].into_iter().map(|s| s.to_string()).collect(),
        material: vec![" Gore-Tex", "聚酯纤维"].into_iter().map(|s| s.to_string()).collect(),
        brand: "情侣户外".to_string(),
        description: "情侣款设计，防风透气".to_string(),
    },
];
    // 初始化工具管理器，注册工具
    let tool_manager = ToolManager::new(vec![
        Box::new(CalculatorTool),
        Box::new(WeatherTool),
        Box::new(StockQueryTool::new(clothes_data.clone())),
        Box::new(MatchingRecommendTool::new(clothes_data.clone())),
        Box::new(DiscountCalculationTool),
    ]);

    tool_manager
}
